package com.cy.pj.common.aspect;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class SysLogAspect {

    /** 切入点定义
     * 1) 使用@Pointcut 注解进行切入点的描述
     * 2) 使用bean表达式定义切入点, 语法bean(Spring容器中某个bean的名称)
     * bean表达式是一种粗粒度的切入点表达式(不能具体到那个方法)
     * doLog()方法不需要写任何内容, 作用是承载切面
     */
    /*这么写切入点只能允许该类执行如下操作, 我们需要更广泛的应用*/
//    @Pointcut("bean(categoryServiceImpl)")
//    @Pointcut("bean(*ServiceImpl)")
    public void doLog(){}



    /**
     *
     * @param joinPoint  为切入点集合方法中的某个正在执行的目标方法
     * @return 为目标方法返回结果
     * @throws Throwable
     */
//    @Around("doLog()") // 该注解描述的方法可以在目标方法执行前后做一些操作.
//    ProceedingJoinPoint 类型的连接点,只能应用在@Around注解描述的方法参数中国
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
        long t1 = System.currentTimeMillis();
        Object result = joinPoint.proceed(); //调用目标方法,result 为目标方法的返回值
        long t2 = System.currentTimeMillis();

        System.err.println("执行时长 : " + (t2 - t1));
        return result;
    }



}
